home *** CD-ROM | disk | FTP | other *** search
- /* An example of an XFun that operates on arrays.
- Accumulates a histogram given an array of values.
- PowerPC version. The project includes the 68K version as a resource*/
-
- #include "callbackg.h"
- #include <CodeFragments.h>
-
- /* Fragment initialization entry point. Must match symbol name in linker prefs */
- OSErr InitCFun(CFragInitBlockPtr iblk);
-
- static short histogram(double *retval)
- {
- EXPR arr;
- double *iptr,*bins,num,binlo,binhi,scl;
- long ndata,i,nbins;
- double sum;
- short isarray;
-
- if(!GetParmVal(2,&binlo)) return(FALSE);
- if(!GetParmVal(1,&binhi)) return(FALSE);
- if(!GetParmVal(0,&num)) return(FALSE);
- nbins = num;
- if(nbins <= 0 || binlo == binhi)
- {
- ErrMsg(" illegal parameter value",0L);
- return(FALSE);
- }
-
- MakeParmExpr(3,&arr);
- ProbeExpr(arr,&num,&isarray,&ndata);
- if(!isarray || !ndata) /* expecting a finite array */
- {
- ErrMsg(" histogram(?,…) array size?",0);
- FreeExpr(arr);
- return(FALSE);
- }
-
- scl = nbins/(binhi-binlo);
- bins = (double *)NewPtrClear(nbins*sizeof(double));
- if(!bins)
- {
- ErrMsg(" not enough memory",0);
- FreeExpr(arr);
- return(FALSE);
- }
-
- AddIndex(&arr,&iptr);
-
- sum = 0;
- *retval = 0;
- *iptr = 1;
- while(ndata--)
- {
- if(EvalExpr(arr,&num)) /* evaluate arr[*iptr] */
- {
- i = (num-binlo)*scl;
- if(i>=0 && i<nbins)
- {
- bins[i] += 1;
- *retval += 1; /* function return value is total points within range */
- sum += num;
- }
- }
- *iptr += 1;
- if(Stopped()) break; /* exit loop if problems */
- }
- FreeExpr(arr);
- SetVarMatrix("bins",bins,nbins,0); /* return histogram in global array "bins" */
- SetVarVal("mean",sum / *retval); /* return mean in global "mean" */
- return(TRUE);
- }
-
- OSErr InitCFun(CFragInitBlockPtr iblk)
- {
- AddCFun("histogram","array,lo,hi,nbins",&histogram,NULL);
- return noErr;
- }
-